package tacos.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.access.prepost.PostAuthorize;
import org.springframework.security.access.prepost.PreAuthorize;
import tacos.data.OrderRepository;

@Configuration
public class OrderAdminService {

    private OrderRepository orderRepo;

    @Autowired
    public OrderAdminService(OrderRepository orderRepo) {
        this.orderRepo = orderRepo;
    }

    /*
    * @PreAuthorize注解会接受一个SpEL表达式，如果表达式的计算结果为false，这个方法将不会被调用；如果表达式的计算结果为true，方法就允许调用。
    * 如果@PreAuthorize阻止调用，那么Spring Security将会抛出AccessDeniedException。这是一个非检查型异常，所以我们不需要捕获它，
    * 除非想要在异常处理中添加一些自定义的行为。如果我们不捕获它，它将会往上传递，最终被Spring Security的过滤器捕获并进行相应的处理——要么返回HTTP 403页面，
    * 要么在用户没有认证的情况下重定向到登录页面。
    * 使@PreAuthorize发挥作用，需要启用全局的方法安全功能。为了实现这一点，需要使用@EnableGlobalMethodSecurity注解标注安全配置类，如下所示：
@Configuration
@EnableGlobalMethodSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
  ...
}
    * */
    @PreAuthorize("hasRole('ADMIN')")
    public void deleteAllOrders() {
        this.orderRepo.deleteAll();
    }
}
